﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using ebcbinder;
using kinokasse.bauteile.contracts.ebcpatterns;
using kinokasse.bauteile.contracts.PreisgruppenRepository;
using kinokasse.bauteile.contracts.Saalpläne;
using kinokasse.bauteile.contracts.SaalpläneRepository;
using kinokasse.datamodel.contracts;

namespace kinokasse.saalpläne
{
    public interface ISaalplanLaden
    {
        void In_Laden(string saalnummer);
        event Action<Saalplan> Out_Saalplan;
    }


    public class SaalplanLaden : ISaalplanLaden
    {
        private Action<string> in_Laden;

        public SaalplanLaden(EbcBinder binder,
                             ISitzeLaden sitzeLaden, 
                             IFilter<string> saalnummerFilter, 
                             IPreisgruppenLaden preisgruppenLaden, 
                             IJoin<IEnumerable<Sitz>, 
                             IEnumerable<Preisgruppe>> joinSitzeUndPreisgruppen, 
                             ISitzeBepreisen sitzeBepreisen) 
        {
            using (binder.BeginGroup(this))
            {
                this.in_Laden += sitzeLaden.In_Laden;
                this.in_Laden += saalnummerFilter.In_Filter;

                sitzeLaden.Out_Sitze += joinSitzeUndPreisgruppen.In0;
                saalnummerFilter.Out_Signal += preisgruppenLaden.In_Laden;
                preisgruppenLaden.Out_Preisgruppen += joinSitzeUndPreisgruppen.In1;
                joinSitzeUndPreisgruppen.Out_Joined += sitzeBepreisen.In_Bepreisen;
                sitzeBepreisen.Out_Saalplan += saalplan => Out_Saalplan(saalplan);
            }
        }


        public void In_Laden(string saalnummer) {
            Trace.TraceInformation("In_Laden Start");
            this.in_Laden(saalnummer);
        }


        public event Action<Saalplan> Out_Saalplan;
    }
}
